package model.player;

import model.GameParameters;
import model.cardData.Card;
import model.cardData.PlayerCardSet;

public class Player {
	
	
	private PlayerCardSet downcards;
	private PlayerCardSet handcards;
	private PlayerCardSet upcards;
	private Dealer cardmaster;
	/**
	 * Dem Spieler wird ein Dealer zugewiesen, der die Tischkarten verwaltet
	 * @param cardmaster wird übergeben, damit Spieler dem Dealer die Karte geben können, die sie spielen wollen
	 */
	public Player(Dealer cardmaster) {
		this.cardmaster = cardmaster;
	}
	
	/**
	 * Der Spieler erhält eine Karte (durch Ziehen oder Startverteilung).
	 * @param c Die übergebene Karte
	 */
	public void giveHandcard(Card c) throws Exception {
		if (handcards.numCards() >= GameParameters.MAX_HANDCARDS)
			throw new Exception("exception: Maximum handcards reached!");
		else 
			handcards.addCard(c);
	}
	/**
	 * Weitere Methode, um dem Spieler HandKarten zukommen zu lassen.
	 * Wird nur verwendet, wenn der Spieler den Zug verloren hat und die Tischkarten aufnehmen muss.
	 * <b>Wichtig:</b> Wirft keine Exception! Ob der Spieler die Karten nehmen muss, soll in der Dealer Klasse
	 * bestimmt werden.
	 * @param c Eine/Die geschluckte Karte
	 */
	public void swallow(Card c) {
		handcards.addCard(c);
	}
	/**
	 * Der Spieler erhält eine Up-Karte.
	 * @param c Die übergebene Karte
	 */
	public void giveUpcard(Card c) throws Exception {
		if (handcards.numCards() >= GameParameters.MAX_UPCARDS)
			throw new Exception("exception: Maximum upcards reached!");
		else 
			upcards.addCard(c);
	}
	/**
	 * Der Spieler erhält eine Down-Karte.
	 * @param c Die übergebene Karte
	 */
	public void giveDowncard(Card c) throws Exception {
		if (handcards.numCards() >= GameParameters.MAX_DOWNCARDS)
			throw new Exception("exception: Maximum downcards reached!");
		else
			downcards.addCard(c);
	}
	
	/**
	 * Methode, um eine Handkarte zu spielen /dem Dealer zu geben.
	 * Ob die Karte gelegt werden kann, wird vom Dealer geprüft,
	 * der wiederum eine Exception wirft, wenn es nicht geht.
	 * 
	 * @param c Die zu spielende Karte
	 * @throws Exception Es können nur Karten gespielt werden, die auch auf der Hand sind!
	 */
	private void playHandcard(Card c) throws Exception {
		if (!handcards.containsCard(c))
			throw new Exception("Exception: Karte nicht auf der Hand!");
		else
			try {
				cardmaster.playCard(c,this);
			} catch(Exception e) {
				//Runde wird nicht beendet
			}
	}
	
	//TODO: Ggf entfernen, falls Methode für das Legen von Paaren etc von Karten nicht benötigt wird
	public void removeHandcard(Card c) throws Exception {
		//handcards.discard(c);
		throw new Exception("exception: Not implemented yet!");
	}
}
